package it.gestionedocumentale.utility;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.StringTokenizer;

public class UtilityDate {
    
    
	// CONVERSIONE FORMATO DATA --> STRINGA
	public synchronized static String dateToString2(Date date, String format) {
		SimpleDateFormat formatter = new SimpleDateFormat(format);
		return formatter.format(date);
	}
	
	public synchronized static String dateToString(Date date) {
		String format = "dd/MM/yyyy";
		SimpleDateFormat formatter = new SimpleDateFormat(format);
		return formatter.format(date);
	}
	
	// FUNZIONE PER RESTITUIRE L'ANNO DA UNA DATA FORMATO STRINGA
	public synchronized static String getYearFromDate(String data){
		String returnValue = "";
		try{
			returnValue = data.substring(0,4);
		}catch(Exception e){
			
		}
		return returnValue;
	}
	
    public synchronized static String dateNowToUsr(){
		Date today = new Date();
		String formatoData = "dd/MM/yyyy";
		SimpleDateFormat formatter = new SimpleDateFormat(formatoData);
		String dataOdierna = formatter.format(today);
		return dataOdierna;
	}
    
    
    /**
	 * Questo metodo ritorna la data convenzionale del 31/12/9999 .
	 * <br>
	 * 
	 * @return la data con 9999-12-31
	 */
	public synchronized static Date dataFine9999() {
	    Calendar calendar = GregorianCalendar.getInstance();
	    calendar.set(9999,Calendar.DECEMBER,31,0,0,0);
	    calendar.set(Calendar.MILLISECOND, 0);
	    
		Date dt = calendar.getTime();
		
		return dt;
	}
	
	public synchronized static Date dataAnte1993() {
	    Calendar calendar = GregorianCalendar.getInstance();
	    calendar.set(1993,Calendar.JANUARY,01,0,0,0);
	    calendar.set(Calendar.MILLISECOND, 0);
	    
		Date dt = calendar.getTime();
		
		return dt;
	}
	

	
	public synchronized static Date dataAnte1996() {
	    Calendar calendar = GregorianCalendar.getInstance();
	    calendar.set(1996,Calendar.JANUARY,1,0,0,0);
	    calendar.set(Calendar.MILLISECOND, 0);
	    
		Date dt = calendar.getTime();
		
		return dt;
	}

	public synchronized static Date data1940() {
	    Calendar calendar = GregorianCalendar.getInstance();
	    calendar.set(1940,Calendar.JANUARY,1,0,0,0);
	    calendar.set(Calendar.MILLISECOND, 0);
	    
		Date dt = calendar.getTime();
		
		return dt;
	}
	
	public synchronized static java.sql.Date impostaDataFinale(int anno) {
	    Calendar calendar = GregorianCalendar.getInstance();
	    calendar.set(anno,Calendar.DECEMBER,31,0,0,0);
	    calendar.set(Calendar.MILLISECOND, 0);
	    
		Date dt = calendar.getTime();
		java.sql.Date sqlDt = java.sql.Date.valueOf(getDateAsString(dt));
		return sqlDt;
	}
	public synchronized static java.sql.Date impostaDataInizio(int anno) {
	    Calendar calendar = GregorianCalendar.getInstance();
	    calendar.set(anno,Calendar.JANUARY,1,0,0,0);
	    calendar.set(Calendar.MILLISECOND, 0);
	    
	    Date dt = calendar.getTime();
		java.sql.Date sqlDt = java.sql.Date.valueOf(getDateAsString(dt));
		return sqlDt;
	}
	
	public synchronized static Date dataFineMesePrecedente() {
		Date dt = new Date(System.currentTimeMillis());
		Calendar cal = Calendar.getInstance();
		cal.setTime(dt);
		int mese =cal.get(Calendar.MONTH);
		int anno =cal.get(Calendar.YEAR);
		int giorno =cal.get(Calendar.DAY_OF_MONTH);
		if(mese==1){
			mese=12;
			anno=anno-1;
			giorno=31;
		}else{
			mese=mese-1;
			giorno=31;
		}
		cal.set(anno,mese,giorno,0,0,0);
		Date data=cal.getTime();
		return data;
	}
	
	public synchronized static Date dataInizioMeseSuccessivo(Date dataFineControllo) {
		
		Calendar cal = Calendar.getInstance();
		cal.setTime(dataFineControllo);
		int mese =cal.get(Calendar.MONTH);
		int anno =cal.get(Calendar.YEAR);
		int giorno =cal.get(Calendar.DAY_OF_MONTH);
		if(mese==12){
			mese=1;
			anno=anno+1;
			giorno=1;
		}else{
			mese=mese+1;
			giorno=1;
		}
		cal.set(anno,mese,giorno,0,0,0);
		Date data=cal.getTime();
		return data;
	}
	
	public synchronized static Date today() {
		Date dt = new Date(System.currentTimeMillis());
		
		return dt;
	}
    
    public static void tempoIniziale() throws Exception{
		
		Date dt = new Date(System.currentTimeMillis());
		Calendar cal = Calendar.getInstance();
		cal.setTime(dt);
		cal.get(Calendar.MINUTE);
		
	}
	
    public static void tempoFinale() throws Exception{
		
		Date dt = new Date(System.currentTimeMillis());
		Calendar cal = Calendar.getInstance();
		cal.setTime(dt);
		cal.get(Calendar.MINUTE);
		
	}
    
    public synchronized static String getDateAsString(Date data, String formato) {
		SimpleDateFormat dateFormat = new SimpleDateFormat(formato);
		return dateFormat.format(data);
	}

	public static String getDateAsString(Date data) {
		return UtilityDate.getDateAsString(data, "yyyy-MM-dd");
	}
	
	public static String getGiornoCorrente() throws Exception{
	    String giorno = "";
	    
		String  data=getDateAsString(today());
		StringTokenizer tokenizer = new StringTokenizer(data,"-");
		giorno = tokenizer.nextToken();
		
		return giorno;
	}
	
	public static String getMeseCorrente() throws Exception{
	    @SuppressWarnings("unused")
		String giorno = "";
		String mese = "";
		
		String  data=getDateAsString(today());
		StringTokenizer tokenizer = new StringTokenizer(data,"-");
		giorno = tokenizer.nextToken();
		mese = tokenizer.nextToken();

		return mese;
	}
	
	public static String getAnnoCorrente() throws Exception{
		
		@SuppressWarnings("unused")
		String giorno = "";
		@SuppressWarnings("unused")
		String mese = "";
		String anno = "";
		
		String  data=getDateAsString(today());
		StringTokenizer tokenizer = new StringTokenizer(data,"-");
		giorno = tokenizer.nextToken();
		mese = tokenizer.nextToken();
		anno = tokenizer.nextToken();

		return anno;
	}
	
	
	public static String getAnno( Date dt) throws Exception{
		
		@SuppressWarnings("unused")
		String giorno = "";
		@SuppressWarnings("unused")
		String mese = "";
		String anno = "";

		String data = getDateAsString(dt);
		StringTokenizer tokenizer = new StringTokenizer(data,"-");
		
		anno = tokenizer.nextToken();
		mese = tokenizer.nextToken();
		giorno = tokenizer.nextToken();
		
		return anno;
	}
	
	/**
	 * 
	 * Ritorna la differenza in Anni tra due date di un documento. Se almeno una
	 * delle due date  null, ritorna null. Questa funzione risulta quindi
	 * essere specializzata per il calcolo della differenza degli anni di
	 * differenza per il solo scopo di effettuare controlli sulla validit
	 * temporale solo di documenti. Questa funzione ritorna null per uno
	 * qualsiasi dei casi di errore. <br>
	 * 
	 * @param dataInizio
	 *            data di partenza per il calcolo della differenza in anni
	 * @param dataFine
	 *            data di arrivo per il calcolo della differenza in anni
	 * @return il numero di anni di intervallo fra le due date
	 */
	public synchronized static Long getIntervalYears(Date dataInizio, Date dataFine){
		//se almeno una delle due date  null, ritorna null.
		if (dataInizio == null || dataFine == null) return new Long(0);
		
		Calendar dataInizioCal = new GregorianCalendar();
		dataInizioCal.setTime(dataInizio);
		Calendar dataFineCal = new GregorianCalendar();
		dataFineCal.setTime(dataFine);

		//check sull'integrit delle due date
		if(dataInizioCal.after(dataFineCal)) return null;

	    // Get interval using the calendar
	    int years = dataFineCal.get(Calendar.YEAR) - dataInizioCal.get(Calendar.YEAR);
	    
	    //Costruisco una data fittizia che dovrebbe corrispondere alla data di inizio piu' gli anni della data
	    //di fine. Questa data  necessaria al confronto con la vera e propria data di fine se i giorni
	    //dall'inizio dell'anno della prima data sono > dei giorni dall'inizio dell'anno della seconda 
	    //data la differenza in anni si arrotonda per difetto.
	    if(years != 0){
	    	Calendar dataDummy = new GregorianCalendar(dataFineCal.get(Calendar.YEAR), dataInizioCal.get(Calendar.MONTH), dataInizioCal.get(Calendar.DATE));
	    	if (dataDummy.after(dataFineCal))
	    		years--;
	    }
	    
	    return new Long(years);
	}	
	

	
//	 FUNZIONE PER AGGIUNGERE / TOGLIERE DEI GIORNI AD UNA DATA 
	public synchronized static Date addDay(Date dateDbf, int dayToAdd){
		
		Calendar c1 = Calendar.getInstance(); 
		c1.setTime(dateDbf);
		c1.add(Calendar.DATE,dayToAdd);
			
		return c1.getTime();
	}
	
	
	public synchronized static boolean dataCompresa(Date inizio, Date fine, Date when) {
	    //se inizio  prima o = a when && fine  dopo when
	    //inizio meno 1 fine + 1
	    inizio = addDay(inizio, -1);
	    fine = addDay(fine, +1);
	    if(inizio.before(when) && fine.after(when))
	        return true;
	    else
	        return false;
	}
	
	
	
	
//	 CONVERSIONE FORMATO STRINGA --> DATA
	//public synchronized static Date stringToDate(String date) {
		//SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		//Date dataConvertita = null;
		//try {
			//dataConvertita = formatter.parse(date);
		//}
		//catch (ParseException e) {
		  //  e.printStackTrace();
		//}
		//return dataConvertita;
	//}
	
//	 CONVERSIONE FORMATO STRINGA --> DATA	
	public synchronized static Date stringToDate(String date) {
		if (date == null || date.equals("")) {
			return null;
		}
		SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
		Date dataConvertita = null;
		try {
			dataConvertita = formatter.parse(date);
		}
		catch (ParseException e) {
		    dataConvertita = null;
		}
		return dataConvertita;
	}
	public synchronized static java.sql.Date stringToDate2(String date) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		Date dataConvertita = null;
		java.sql.Date dataConvertitaSql = null;
		try {
			dataConvertita = formatter.parse(date);
			dataConvertitaSql = (java.sql.Date) new Date(dataConvertita.getTime());
		}
		catch (ParseException e) {
		    dataConvertita = null;
		}
		return dataConvertitaSql;
	}
}
